#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <string.h>
#include <fcntl.h>

#include "font.h"

char *fbmem;

void initLCD()
{
        // 准备好LCD设备（如果多次显示，应该只做一遍）
    int lcd = open("/dev/fb0", O_RDWR);

    // 映射一块恰当大小的显存（即所谓的帧缓冲）
    fbmem = mmap(NULL, 800*480*4, PROT_READ|PROT_WRITE, MAP_SHARED, lcd, 0);
    if(fbmem == MAP_FAILED)
    {
        perror("映射内存失败");
        exit(0);
    }
}

void showbitmap(bitmap *bm, int x, int y)
{
    printf("bm.width: %d\n", bm->width);
    printf("bm.height: %d\n", bm->height);
    printf("bm.byteperpixel: %d\n", bm->byteperpixel);

    // 调测一下显示的内容
    for(int j=0; j<480 && j<bm->height; j++)
    {
        for(int i=0; i<800 && i<bm->width; i++)
        {
            memcpy(fbmem+4*i + 800*4*j,
                   bm->map+bm->byteperpixel*i + bm->width*bm->byteperpixel*j,
                   bm->byteperpixel);
        }
    }


    // // 字体的信息：
    // bm->width;
    // bm->height;
    // bm->byteperpixel;
    // bm->map; // 指向RGB数据，没有上下颠倒，也没有一行4字节倍数的约束，就是纯粹的RGB


}

int main(int argc, char const *argv[])
{
    //1.初始化字库 
    // 注意要先将ttf文件放入开发板上
    font *f = fontLoad("simfang.ttf"); // 指定字库文件，比如simfang.ttf

    //2.设置字体的大小 
    fontSetSize(f, 24);

    //3.设置字体输出框的大小
    bitmap *bm;
    bm = createBitmapWithInit(800, 28, 4, 0xFFFFFFFF);

    initLCD();

    // 打开管道
    // ...
    // ...

    //4.把字体输出到输出框中
    while(1)
    {
        // 静静地等待管道的信息
        // ...

        // 清屏
        // ...

        fontPrint(f, bm, 80, 2, buf, 0xFF000000, 0);

        //5.将bm妥善地放置到LCD上显示出来
        showbitmap(bm, 0, 0);
    }

    return 0;
}
